import SSA.Core.WellTypedFramework import SSA.Core.Tactic import SSA.Projects.InstCombine.InstCombineBase import SSA.Projects.InstCombine.InstCombineAliveStatements open SSA InstCombine -- Name:AddSub:1043 -- precondition: true /- %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = add %LHS, %RHS => %or = or %Z, ~C1 %Y = and %Z, C1 %X = xor %Y, C1 %LHS = add %X, 1 %r = sub %RHS, %or -/ open SSA EDSL inexample : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeZZ: โC1C1: โRHS :RHS: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4076TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:add1: ?m.5093w %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:addRHS: โw %v11 dsl_ret %v12 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.4076TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โZ)) %v9999; %v2 := op:const (Bitvec.ofInt'Z: โw (w: โC1)) %v9999; %v3 := op:notC1: โw %v2; %v4 := pair:%v1 %v3; %v5 := op:orw: โw %v4; %v6 := pair:%v1 %v2; %v7 := op:andw: โw %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (w: โ1)) %v9999; %v11 := pair:%v9 %v10; %v12 := op:add1: ?m.8921w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (w: โRHS)) %v9999; %v14 := pair:%v13 %v5; %v15 := op:subRHS: โw %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS')) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ')) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.xor (Bitvec.and (Bitvec.ofInt' w โZ') (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w โC1)) (Bitvec.ofInt' w 1)) fun fst => Bitvec.add? fst (Bitvec.ofInt' w โRHS')) โ some (Bitvec.sub (Bitvec.ofInt' w โRHS') (Bitvec.or (Bitvec.ofInt' w โZ') (Bitvec.not (Bitvec.ofInt' w โC1))))โ (w : โ), โ โ โ โ โ โ โ (Z C1 RHS : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w โRHS)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w 1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 3 (TSSA.op (Op.not w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โZ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1152 -- precondition: true /- %r = add i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.75322TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addy: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.75322TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ) โ some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1164 -- precondition: true /- %na = sub 0, %a %c = add %na, %b => %na = sub 0, %a %c = sub %b, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.98433TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.100049w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:addb: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.98433TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.102335w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:subb: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.ofInt' wโ โbโ) โ some (Bitvec.sub (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ โaโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1165 -- precondition: true /- %na = sub 0, %a %nb = sub 0, %b %c = add %na, %nb => %ab = add %a, %b %na = sub 0, %a %nb = sub 0, %b %c = sub 0, %ab -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.132195TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.134829w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := op:const (Bitvec.ofInt'0: ?m.133198w (w: โb)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:subb: โw %v7; %v9 := pair:%v4 %v8; %v10 := op:addw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.132195TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:sub0: ?m.137138w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v9 := pair:%v8 %v2; %v10 := op:sub0: ?m.136635w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v12 := pair:%v11 %v4; %v13 := op:sub0: ?m.136090w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ)) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) โ Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ 0) snd)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1176 -- precondition: true /- %nb = sub 0, %b %c = add %a, %nb => %nb = sub 0, %b %c = sub %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typebb: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.188510TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.190126w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:adda: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.188510TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.192412w (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:suba: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โbโ)) โ some (Bitvec.sub (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (b a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1295 -- precondition: true /- %aab = and %a, %b %aob = xor %a, %b %c = add %aab, %aob => %aab = and %a, %b %aob = xor %a, %b %c = or %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.221990TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.221990TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.266996TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.266996TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-2 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nsw %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.310329TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.310329TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1309-3 -- precondition: true /- %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %lhs, %rhs => %lhs = and %a, %b %rhs = or %a, %b %c = add nuw %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.353662TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:addw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.353662TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:addw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eBitvec.add? (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) โ Bitvec.add? (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1539 -- precondition: true /- %na = sub 0, %a %r = sub %x, %na => %na = sub 0, %a %r = add %x, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.397244TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.398860w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.397244TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.401146w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) โ Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1546 -- precondition: true /- %na = sub nsw 0, %a %r = sub nsw %x, %na => %na = sub nsw 0, %a %r = add nsw %x, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โx :x: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.431147TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.432763w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:subx: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.431147TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v2 := op:const (Bitvec.ofInt'0: ?m.435049w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:addx: โw %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โaโ))) โ Bitvec.add? (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โaโ)โ (w : โ), โ โ โ โ โ (a x : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1556 -- precondition: true /- %r = sub i1 %x, %y => %r = xor %x, %y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.464037TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suby: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.464037TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xory: โw %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) โ some (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1560 -- precondition: true /- %r = sub -1, %a => %r = xor %a, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.488077TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v2 := op:const (Bitvec.ofInt'1: ?m.488671w (w: โa)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:suba: โw %v3 dsl_ret %v4 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.488077TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.490162w %v3 dsl_ret %v4 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.ofInt' wโ (-1)) (Bitvec.ofInt' wโ โaโ)) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ (a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1614 -- precondition: true /- %Op1 = add %X, %Y %r = sub %X, %Op1 => %Op1 = add %X, %Y %r = sub 0, %Y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.515544TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:subw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.515544TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:addY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.517748w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e(Option.bind (Bitvec.add? (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) fun snd => some (Bitvec.sub (Bitvec.ofInt' wโ โXโ) snd)) โ some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.add w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1619 -- precondition: true /- %Op0 = sub %X, %Y %r = sub %Op0, %X => %Op0 = sub %X, %Y %r = sub 0, %Y -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeXX: โY :Y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.550246TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:subw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.550246TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โX)) %v9999; %v2 := op:const (Bitvec.ofInt'X: โw (w: โY)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:subY: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โ0)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:sub0: ?m.552450w %v6 dsl_ret %v7 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โYโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โXโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.sub (Bitvec.ofInt' wโ โXโ) (Bitvec.ofInt' wโ โYโ)) (Bitvec.ofInt' wโ โXโ)) โ some (Bitvec.sub (Bitvec.ofInt' wโ 0) (Bitvec.ofInt' wโ โYโ))โ (w : โ), โ โ โ โ โ (X Y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w 0)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โY)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โX)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AddSub:1624 -- precondition: true /- %Op0 = or %A, %B %Op1 = xor %A, %B %r = sub %Op0, %Op1 => %Op0 = or %A, %B %Op1 = xor %A, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.585383TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:subw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.585383TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:andw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.sub (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.sub w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1230 ~A & ~B -> ~(A | B) -- precondition: true /- %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %or = or %notOp0, %notOp1 %op0 = xor %notOp0, -1 %op1 = xor %notOp1, -1 %r = xor %or, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypenotOp0notOp0: โnotOp1 :notOp1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.632975TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.635272w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnotOp1)) %v9999; %v6 := op:const (Bitvec.ofInt'notOp1: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.633732w %v7; %v9 := pair:%v4 %v8; %v10 := op:andw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.632975TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnotOp0)) %v9999; %v2 := op:const (Bitvec.ofInt'notOp0: โw (w: โnotOp1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ornotOp1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.637754w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.637229w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.636661w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnotOp0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โnotOp1โ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โnotOp0โ) (Bitvec.ofInt' wโ โnotOp1โ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (notOp0 notOp1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnotOp0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1241 (A|B) & ~(A&B) => A^B -- precondition: true /- %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = and %op0, %op1 => %op0 = or %A, %B %notOp1 = and %A, %B %op1 = xor %notOp1, -1 %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.693660TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.694425w %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.693660TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:andw: โw %v5; %v7 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v8 := pair:%v6 %v7; %v9 := op:xor1: ?m.698211w %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1247 ~(A&B) & (A|B) => A^B -- precondition: true /- %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = and %op0, %op1 => %notOp0 = and %A, %B %op0 = xor %notOp0, -1 %op1 = or %A, %B %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.763061TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.764229w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.763061TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.767944w %v6; %v8 := pair:%v1 %v2; %v9 := op:orw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1))) (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1253 A & (A^B) -> A & ~B -- precondition: true /- %op0 = xor %A, %B %r = and %op0, %A => %notB = xor %B, -1 %op0 = xor %A, %B %r = and %A, %notB -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.829751TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v4 %v1; %v6 := op:andw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.829751TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.832812w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1280 (~A|B)&A -> A&B -- precondition: true /- %nA = xor %A, -1 %op0 = or %nA, %B %r = and %op0, %A => %nA = xor %A, -1 %op0 = or %nA, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.878045TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.879406w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.878045TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.882421w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1288 (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %op1 => %op0 = xor %A, %B %negC = xor %C, -1 %x = xor %B, %C %op1 = xor %x, %A %r = and %op0, %negC -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โCC: โAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.933218TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.933218TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := op:const (Bitvec.ofInt'C: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.938015w %v7; %v9 := pair:%v2 %v5; %v10 := op:xorw: โw %v9; %v11 := pair:%v10 %v1; %v12 := op:xorw: โw %v11; %v13 := pair:%v4 %v8; %v14 := op:andw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โCโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:1294 (A | B) & ((~A) ^ B) -> (A & B) -- precondition: true /- %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %op0, %op1 => %op0 = or %A, %B %x = xor %A, -1 %op1 = xor %x, %B %r = and %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1022043TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.1023210w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:andw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1022043TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.1026998w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v1 %v2; %v11 := op:andw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2113 ((~A & B) | A) -> (A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %negA, %B %r = or %op0, %A => %negA = xor %A, -1 %op0 = and %negA, %B %r = or %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1091030TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1092391w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1091030TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1095406w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v1 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โAโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2118 ((A & B) | ~A) -> (~A | B) -- precondition: true /- %negA = xor %A, -1 %op0 = and %A, %B %r = or %op0, %negA => %negA = xor %A, -1 %op0 = and %A, %B %r = or %negA, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1146107TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1147468w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v7 %v4; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1146107TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1150483w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2123 (A & (~B)) | (A ^ B) -> (A ^ B) -- precondition: true /- %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = or %op0, %op1 => %negB = xor %B, -1 %op0 = and %A, %negB %op1 = xor %A, %B %r = xor %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โAA: โBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1204343TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1206076w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v7 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1204343TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1209431w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:andA: โw %v6; %v8 := pair:%v5 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v5 %v1; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2188 -- precondition: true /- %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = or %op0, %op1 => %C = xor %D, -1 %B = xor %A, -1 %op0 = and %A, %C %op1 = and %B, %D %r = xor %A, %D -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeDD: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1270568TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1273663w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1272129w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:orw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1270568TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โD)) %v9999; %v2 := op:const (Bitvec.ofInt'D: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1277615w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1276107w %v7; %v9 := pair:%v5 %v4; %v10 := op:andw: โw %v9; %v11 := pair:%v8 %v1; %v12 := op:andw: โw %v11; %v13 := pair:%v5 %v1; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โDโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โDโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โDโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โDโ))โ (w : โ), โ โ โ โ โ (D A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โD)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2231 (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C -- precondition: true /- %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %op1 => %op0 = xor %A, %B %x = xor %B, %C %op1 = xor %x, %A %r = or %op0, %C -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โC :C: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1353968TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1353968TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xorC: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ โCโ))โ (w : โ), โ โ โ โ โ โ โ (A B C : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2243 ((B | C) & A) | B -> B | (A & C) -- precondition: true /- %o = or %B, %C %op0 = and %o, %A %r = or %op0, %B => %a = and %A, %C %o = or %B, %C %op0 = and %o, %A %r = or %B, %a -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โCC: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1425022TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andA: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1425022TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andC: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v5 %v2; %v7 := op:orB: โw %v6; %v8 := pair:%v7 %v1; %v9 := op:andw: โw %v8; %v10 := pair:%v5 %v4; %v11 := op:orw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โCโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ โCโ)) (Bitvec.ofInt' wโ โAโ)) (Bitvec.ofInt' wโ โBโ)) โ some (Bitvec.or (Bitvec.ofInt' wโ โBโ) (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โCโ)))โ (w : โ), โ โ โ โ โ โ โ (A C B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2247 (~A | ~B) == (~(A & B)) -- precondition: true /- %na = xor %A, -1 %nb = xor %B, -1 %r = or %na, %nb => %a = and %A, %B %na = xor %A, -1 %nb = xor %B, -1 %r = xor %a, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1486040TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1488337w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1486797w %v7; %v9 := pair:%v4 %v8; %v10 := op:orw: โw %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1486040TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.1490819w %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v2 %v8; %v10 := op:xor1: ?m.1490294w %v9; %v11 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v12 := pair:%v4 %v11; %v13 := op:xor1: ?m.1489726w %v12 dsl_ret %v13 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 13 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 11 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2263 -- precondition: true /- %op1 = xor %op0, %B %r = or %op0, %op1 => %op1 = xor %op0, %B %r = or %op0, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeop0op0: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1544691TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v4; %v6 := op:orw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1544691TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop0)) %v9999; %v2 := op:const (Bitvec.ofInt'op0: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5 dsl_ret %v6 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop0โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.xor (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โop0โ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (op0 B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop0)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2264 -- precondition: true /- %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %op1 => %nb = xor %B, -1 %na = xor %A, -1 %op1 = xor %na, %B %r = or %A, %nb -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1579985TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1581346w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xorB: โw %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1579985TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1585744w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1584230w %v7; %v9 := pair:%v8 %v1; %v10 := op:xorw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2265 -- precondition: true /- %op0 = and %A, %B %op1 = xor %A, %B %r = or %op0, %op1 => %op0 = and %A, %B %op1 = xor %A, %B %r = or %A, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1641426TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:orw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1641426TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2284 -- precondition: true /- %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = or %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1689135TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.1689908w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1689135TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1695173w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:orA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.1693274w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2285 -- precondition: true /- %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %op1 => %not = xor %B, -1 %o = xor %A, %B %op1 = xor %o, -1 %r = or %A, %not -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeBB: โA :A: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1752119TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.1752892w %v6; %v8 := pair:%v1 %v7; %v9 := op:orw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1752119TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v2 := op:const (Bitvec.ofInt'B: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1758157w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:xorA: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.1756258w %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.xor (Bitvec.ofInt' wโ โBโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (B A : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2297 -- precondition: true /- %op0 = and %A, %B %na = xor %A, -1 %op1 = xor %na, %B %r = or %op0, %op1 => %na = xor %A, -1 %op0 = and %A, %B %op1 = xor %na, %B %r = xor %na, %B -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โBB: โAA: โB :B: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1815503TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โB)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andB: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:xor1: ?m.1816670w %v6; %v8 := pair:%v7 %v2; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v9; %v11 := op:orw: โw %v10 dsl_ret %v11 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1815503TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1820877w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โB)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andB: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:xorw: โw %v8; %v10 := pair:%v4 %v5; %v11 := op:xorw: โw %v10 dsl_ret %v11 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โBโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.and (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โBโ)) (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))) โ some (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โBโ))โ (w : โ), โ โ โ โ โ (A B : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 11 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 10 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โB)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2367 -- precondition: true /- %op0 = or %A, C1 %r = or %op0, %op1 => %i = or %A, %op1 %op0 = or %A, C1 %r = or %i, C1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: TypeAA: โop1op1: โC1 :C1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1885742TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โC1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orC1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:orop1: โw %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1885742TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โA)) %v9999; %v2 := op:const (Bitvec.ofInt'A: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โC1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orC1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:orw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โC1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โAโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โC1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.or (Bitvec.or (Bitvec.ofInt' wโ โAโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โC1โ))โ (w : โ), โ โ โ โ โ โ โ (A op1 C1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โC1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โA)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2416 -- precondition: true /- %x = xor %nx, -1 %op0 = and %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1931725TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1934016w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andy: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.1932106w %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1931725TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1937588w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1936080w %v7; %v9 := pair:%v8 %v1; %v10 := op:andw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.or (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2417 -- precondition: true /- %x = xor %nx, -1 %op0 = or %x, %y %r = xor %op0, -1 => %ny = xor %y, -1 %x = xor %nx, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeyy: โnx :nx: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1994430TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v2 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.1996721w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:ory: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v7 %v8; %v10 := op:xor1: ?m.1994811w %v9 dsl_ret %v10 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.1994430TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v2 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2000293w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โnx)) %v9999; %v6 := op:const (Bitvec.ofInt'nx: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.1998785w %v7; %v9 := pair:%v8 %v1; %v10 := op:orw: โw %v9; %v11 := pair:%v5 %v4; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โnxโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โnxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.and (Bitvec.ofInt' wโ โnxโ) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (y nx : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โnx)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2429 -- precondition: true /- %op0 = and %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = and %x, %y %r = or %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2056877TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andy: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2057258w %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2056877TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2062535w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2061023w %v7; %v9 := pair:%v1 %v5; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:orw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2430 -- precondition: true /- %op0 = or %x, %y %r = xor %op0, -1 => %nx = xor %x, -1 %ny = xor %y, -1 %op0 = or %x, %y %r = and %nx, %ny -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typexx: โy :y: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2116571TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (w: โy)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:ory: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:xor1: ?m.2116952w %v6 dsl_ret %v7 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2116571TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โx)) %v9999; %v2 := op:const (Bitvec.ofInt'x: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2122229w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โy)) %v9999; %v6 := op:const (Bitvec.ofInt'y: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2120717w %v7; %v9 := pair:%v1 %v5; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v8; %v12 := op:andw: โw %v11 dsl_ret %v12 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โyโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โxโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ โyโ)) (Bitvec.ofInt' wโ (-1))) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โxโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.xor (Bitvec.ofInt' wโ โyโ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (x y : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โy)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โx)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2581 (B|A)^B -> A & ~B -- precondition: true /- %op0 = or %a, %op1 %r = xor %op0, %op1 => %nop1 = xor %op1, -1 %op0 = or %a, %op1 %r = and %a, %nop1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โop1op1: โop1op1: โa :a: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2175019TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:orop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2175019TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v2 := op:const (Bitvec.ofInt'op1: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2178072w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v1; %v7 := op:ora: โw %v6; %v8 := pair:%v5 %v4; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โop1โ) (Bitvec.ofInt' wโ (-1))))โ (w : โ), โ โ โ โ โ (op1 a : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2587 (B&A)^A -> ~B & A -- precondition: true /- %op0 = and %a, %op1 %r = xor %op0, %op1 => %na = xor %a, -1 %op0 = and %a, %op1 %r = and %na, %op1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โop1op1: โaa: โop1 :op1: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2221876TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โop1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andop1: โw %v3; %v5 := pair:%v4 %v2; %v6 := op:xorw: โw %v5 dsl_ret %v6 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2221876TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2224929w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โop1)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:andop1: โw %v6; %v8 := pair:%v4 %v5; %v9 := op:andw: โw %v8 dsl_ret %v9 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โop1โ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โop1โ)) (Bitvec.ofInt' wโ โop1โ)) โ some (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โop1โ))โ (w : โ), โ โ โ โ โ (a op1 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair Context.Var.last (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โop1)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2595 -- precondition: true /- %op0 = and %a, %b %op1 = or %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = or %a, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2269443TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2269443TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:orw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2607 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = or %a, %nb %op1 = or %na, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2317841TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2320938w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2319404w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2317841TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2324892w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2323384w %v7; %v9 := pair:%v1 %v8; %v10 := op:orw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.or (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2617 -- precondition: true /- %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %op0, %op1 => %na = xor %a, -1 %nb = xor %b, -1 %op0 = and %a, %nb %op1 = and %na, %b %r = xor %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2402087TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2405184w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2403650w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v10 %v12; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2402087TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2409138w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v7 := pair:%v5 %v6; %v8 := op:xor1: ?m.2407630w %v7; %v9 := pair:%v1 %v8; %v10 := op:andw: โw %v9; %v11 := pair:%v4 %v5; %v12 := op:andw: โw %v11; %v13 := pair:%v1 %v5; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2627 -- precondition: true /- %op0 = xor %a, %c %op1 = or %a, %b %r = xor %op0, %op1 => %na = xor %a, -1 %and = and %na, %b %op0 = xor %a, %c %op1 = or %a, %b %r = xor %and, %c -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ โ โ (a b c_2 : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc_2)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc_2)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โcc: โbb: โaa: โbb: โc :c: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2485067TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โc)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xorc: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v1 %v5; %v7 := op:orb: โw %v6; %v8 := pair:%v4 %v7; %v9 := op:xorw: โw %v8 dsl_ret %v9 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2485067TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2490584w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v6 := pair:%v4 %v5; %v7 := op:andb: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (w: โc)) %v9999; %v9 := pair:%v1 %v8; %v10 := op:xorc: โw %v9; %v11 := pair:%v1 %v5; %v12 := op:orw: โw %v11; %v13 := pair:%v7 %v8; %v14 := op:xorw: โw %v13 dsl_ret %v14 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ โcโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โcโ)) (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.xor (Bitvec.and (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1))) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ โcโ))โ (w : โ), โ โ โ โ โ โ โ (a b c : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 9 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 14 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 13 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w โc)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2647 -- precondition: true /- %op0 = and %a, %b %op1 = xor %a, %b %r = xor %op0, %op1 => %op0 = and %a, %b %op1 = xor %a, %b %r = or %a, %b -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2559063TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v4 %v6; %v8 := op:xorw: โw %v7 dsl_ret %v8 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2559063TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := pair:%v1 %v2; %v6 := op:xorw: โw %v5; %v7 := pair:%v1 %v2; %v8 := op:orw: โw %v7 dsl_ret %v8 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))) โ some (Bitvec.or (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev Context.Var.last)) Context.Var.last)) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 8 (TSSA.op (Op.or w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) โ (fun prev => TSSA.assign prev 6 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 5 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) (Context.Var.prev (Context.Var.prev Context.Var.last)))) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e-- Name:AndOrXor:2658 -- precondition: true /- %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %op0, %na => %and = and %a, %b %nb = xor %b, -1 %op0 = and %a, %nb %na = xor %a, -1 %r = xor %and, -1 -/ open SSA EDSL inGoals accomplished! ๐example : forall (example: โ {c : Context BaseType} {e : EnvC c} (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) ew :w: โNat) (Nat: Typeaa: โb :b: โNat),Nat: TypeTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2607019TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โb)) %v9999; %v2 := op:const (Bitvec.ofInt'b: โw (-w: โ1)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:xor1: ?m.2609689w %v3; %v5 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v6 := pair:%v5 %v4; %v7 := op:anda: โw %v6; %v8 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v9 := pair:%v5 %v8; %v10 := op:xor1: ?m.2607784w %v9; %v11 := pair:%v7 %v10; %v12 := op:xorw: โw %v11 dsl_ret %v12 ] โw: โTSSA.eval (Op :=TSSA.eval: {Op ฮฒ : Type} โ [inst : Goedel ฮฒ] โ [TUS : TypedUserSemantics Op ฮฒ] โ {ฮ : Context ฮฒ} โ {i : TSSAIndex ฮฒ} โ TSSA Op ฮ i โ EnvC ฮ โ TSSAIndex.eval iOp) (e :=Op: Typee) (i :=e: ?m.2607019TSSAIndex.TERMINATOR (TSSAIndex.TERMINATOR: {ฮฒ : Type} โ SSA.UserType ฮฒ โ TSSAIndex ฮฒUserType.base (BaseType.bitvecUserType.base: {ฮฒ : Type} โ ฮฒ โ SSA.UserType ฮฒw))) [dsl_bb| ^bb %v9999 := unit: ; %v1 := op:const (Bitvec.ofInt'w: โw (w: โa)) %v9999; %v2 := op:const (Bitvec.ofInt'a: โw (w: โb)) %v9999; %v3 := pair:%v1 %v2; %v4 := op:andb: โw %v3; %v5 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v6 := pair:%v2 %v5; %v7 := op:xor1: ?m.2612621w %v6; %v8 := pair:%v1 %v7; %v9 := op:andw: โw %v8; %v10 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v11 := pair:%v1 %v10; %v12 := op:xor1: ?m.2611703w %v11; %v13 := op:const (Bitvec.ofInt'w: โw (-w: โ1)) %v9999; %v14 := pair:%v4 %v13; %v15 := op:xor1: ?m.2611100w %v14 dsl_ret %v15 ] :=w: โGoals accomplished! ๐โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eTSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' wโ (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and wโ) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' wโ โbโ)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' wโ โaโ)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eโ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) esome (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.xor (Bitvec.ofInt' wโ โbโ) (Bitvec.ofInt' wโ (-1)))) (Bitvec.xor (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ (-1)))) โ some (Bitvec.xor (Bitvec.and (Bitvec.ofInt' wโ โaโ) (Bitvec.ofInt' wโ โbโ)) (Bitvec.ofInt' wโ (-1)))โ (w : โ), โ โ โ โ โ (a b : โ), TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 8 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair Context.Var.last (Context.Var.prev Context.Var.last))) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) e โ TSSA.eval (TSSA.ret (((fun prev => TSSA.assign prev 15 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 14 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 13 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 12 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 11 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 10 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))))))))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 8 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))))) Context.Var.last)) โ (fun prev => TSSA.assign prev 7 (TSSA.op (Op.xor w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 6 (TSSA.pair (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last))) Context.Var.last)) โ (fun prev => TSSA.assign prev 5 (TSSA.op (Op.const (Bitvec.ofInt' w (-1))) (Context.Var.prev (Context.Var.prev (Context.Var.prev (Context.Var.prev Context.Var.last)))) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 4 (TSSA.op (Op.and w) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 3 (TSSA.pair (Context.Var.prev Context.Var.last) Context.Var.last)) โ (fun prev => TSSA.assign prev 2 (TSSA.op (Op.const (Bitvec.ofInt' w โb)) (Context.Var.prev Context.Var.last) TSSA.rgn0)) โ (fun prev => TSSA.assign prev 1 (TSSA.op (Op.const (Bitvec.ofInt' w โa)) Context.Var.last TSSA.rgn0)) โ (fun prev => TSSA.assign prev 9999 TSSA.unit) โ id) TSSA.nop) Context.Var.last) eGoals accomplished! ๐